package com.aitou.mrylive.data.repository;

import com.aitou.mrylive.data.bean.AnchoBean;
import com.aitou.mrylive.data.bean.AnchorSummary;
import com.aitou.mrylive.data.bean.BaseResponse;
import com.aitou.mrylive.data.bean.CurrencyRankItem;
import com.aitou.mrylive.data.bean.GetFriendBean;
import com.aitou.mrylive.data.bean.HotAnchorPageBean;
import com.aitou.mrylive.data.bean.HotAnchorSummary;
import com.aitou.mrylive.data.bean.IncomeBean;
import com.aitou.mrylive.data.bean.LoginInfo;
import com.aitou.mrylive.data.bean.PageBean;
import com.aitou.mrylive.data.bean.PushStreamInfo;
import com.aitou.mrylive.data.bean.ThemBean;
import com.aitou.mrylive.data.bean.ThirdLoginPlatform;
import com.aitou.mrylive.data.bean.gift.Gift;
import com.aitou.mrylive.data.bean.me.PlayBackInfo;
import com.aitou.mrylive.data.bean.me.UserInfo;
import com.aitou.mrylive.data.bean.room.HitList;
import com.aitou.mrylive.data.bean.room.LiveRoomEndInfo;
import com.aitou.mrylive.data.bean.room.RoomAdminInfo;
import com.aitou.mrylive.data.bean.transaction.PresentRecordItem;
import com.aitou.mrylive.data.bean.transaction.RechargeInfo;
import com.aitou.mrylive.data.bean.transaction.WithDrawRespose;
import com.aitou.mrylive.presentation.ui.main.find.pengyouquan.DongTaiDetailBean;
import com.aitou.mrylive.presentation.ui.main.find.pengyouquan.DongTaiListBean;
import com.aitou.mrylive.presentation.ui.main.find.pengyouquan.MeiLiBangBean;
import com.aitou.mrylive.presentation.ui.main.find.pengyouquan.MyDongTaiBean;
import com.aitou.mrylive.presentation.ui.main.find.pengyouquan.PublishBean;

import java.util.List;

import rx.Observable;

/**
 * 定义网络请求相关方法。
 * Created by huanzhang on 2016/4/11.
 * @since 1.0.0
 */
public interface ISource {

    /**
     * 注册新用户，成功时返回新用户的登录信息。
     * @param username 用户名
     * @param password 密码
     */
    Observable<BaseResponse<LoginInfo>> register(String username, String password);

    /**
     * 使用token执行自动登录。
     * @param token 存储在本地的token。
     */
    Observable<BaseResponse<LoginInfo>> autoLogin(String token);

    /**
     * 使用账户名和密码登录。
     * @param username 用户名，明文
     * @param password 密码，明文
     */
    Observable<BaseResponse<LoginInfo>> login(String username, String password);
    /**
     * 使用账户名和密码登录。
     * @param username 用户名，明文
     * @param captcha 验证码，明文
     */
    Observable<BaseResponse<LoginInfo>> loginByCaptcha(String username, String captcha);

    /**
     * 查询首页推荐的热门主播列表，附带Banner图片。
     */
    Observable<BaseResponse<List<HotAnchorSummary>>> loadFollowedLives(int pageNum);

    /**
     * 查询首页推荐的话题
     */
    Observable<BaseResponse<List<HotAnchorSummary>>> loadTopicLives(int topicID);

    /**
     * 查询首页推荐的热门主播列表，附带Banner图片。
     */
    Observable<BaseResponse<HotAnchorPageBean>> loadHotAnchors(int pageNum);

    /**
     * 查询首页推荐的热门主播列表，附带Banner图片。
     */
    Observable<BaseResponse<HotAnchorPageBean>> loadHotAnchors(String token,String city,String sex);

    /**
     * 查询首页推荐的热门主播列表，附带Banner图片。
     */
    Observable<BaseResponse<PageBean<AnchorSummary>>> loadRecommendAnchors(String token,String time);
    /**
     * 同城
     */
    Observable<BaseResponse<PageBean<AnchorSummary>>> loadCommendAnchors(String token,String city);

    /**
     * 根据指定的条件查询主播列表。
     * @param condition 查询条件
     * @param pageNum 页号
     */
    Observable<BaseResponse<PageBean<AnchorSummary>>> queryAnchors(String condition, int pageNum);

    /**
     * 根据指定的AnchorId来执行关注操作。
     * 该操作为异步静默操作，即点击关注后就会实施UI变更，所以返回值为Object，意为忽略。
     */
    Observable<BaseResponse<Object>> followAnchor(String uid);

    /**
     * 取消对指定用户的关注。
     * @see #followAnchor(String)
     */
    Observable<BaseResponse<Object>> unfollowAnchor(String uid);

    Observable<BaseResponse<UserInfo>> getUserInfo(Integer uid);

    Observable<BaseResponse<String>> getEmotion(String token,int emotion);

    Observable<BaseResponse<String>> setBirthday(String token,String birthday);

    Observable<BaseResponse<String>> getProvince(String token,String province,String city);

    Observable<BaseResponse<AnchoBean>> getAnchoBean(String user_id);

    /**
     * 关注用户
     * @param uid
     * @return
     */
    Observable<BaseResponse<String>> starUser(String token,String uid,String roomid);

    /**
     * 取消关注用户
     * @param uid
     * @return
     */
    Observable<BaseResponse<String>> unStarUser(String token,String uid,String roomid);

    /**
     * 获取用户关注列表
     * @param uid
     * @return
     */
    Observable<BaseResponse<PageBean<AnchorSummary>>> getUserStars(String uid, int pageNum);
    /**
     * 获取用户粉丝列表
     * @param uid
     * @getStars
     */
    Observable<BaseResponse<PageBean<AnchorSummary>>> getUserFans(String uid, int pageNum);

    /**
     * 获取可用的礼物列表。
     */
    Observable<BaseResponse<List<Gift>>> getAvailableGifts();

    /**
     * 送礼物。
     * @param toUserId 接收礼物的人
     * @param giftId 礼物的ID
     * @param count 数量，至少为1
     */
    Observable<BaseResponse<Object>> sendGift(String toUserId, String giftId, int count);
//    送红包
    Observable<BaseResponse<Object>> sendHongBaoGift(String token, String roomuid, String giftid);
    /**
     * 修改个人资料
     * @param profileJson 待修改的属性组成的JSON字符串。
     */
    Observable<BaseResponse<String>> editProfile(String profileJson);

    Observable<BaseResponse<String>> editJob(String token,String professional);

    /**
     * @param status 新状态
     */
    Observable<BaseResponse<Object>> setLiveStatus(String token,String status);

    /**
     * 获取已结束的直播间信息，包含观看人数和秀币总收入。
     */
    Observable<BaseResponse<LiveRoomEndInfo>> getLiveRoomInfo(String roomId);

    /**
     * 获取充值信息。
     */
    Observable<BaseResponse<RechargeInfo>> getRechargeMap();

    /**
     * 上报用户地理位置
     * @param lat 纬度
     * @param lng 经度
     */
    Observable<BaseResponse<Object>> reportLocation(String lat, String lng);
    /**
     * 获取秀币排行榜。
     */
    Observable<BaseResponse<PageBean<CurrencyRankItem>>> getCurrencyRankList(String uid,int page);

    /**
     * 上传头像。
     * @param path 头像的存储文件地址
     */
    Observable<BaseResponse<String>> uploadAvatar(String path);

    /**
     * 获取收益及提现信息。
     */
    Observable<BaseResponse<IncomeBean>> getIncomeBean();

    /**
     * 提现
     * @param num 金额
     * @return
     */
    Observable<BaseResponse<WithDrawRespose>> withDraw(String num, String account);

    /**
     * 获取提现记录
     * @return
     */
    Observable<BaseResponse<List<PresentRecordItem>>> getPresentRecord();

    /**
     * 第三方登录信息
     * @param openId 第三方平台OpenId
     * @param platform 第三方平台标记
     * @param extras 第三方登录返回的用户资料
     */
    Observable<BaseResponse<LoginInfo>> thirdLogin(String openId, @ThirdLoginPlatform String
            platform, String extras);

    /**
     * 根据指定的金额生成订单信息。
     * @param amount 金额
     * @return 生成的订单号，包含验签等信息。
     */
    Observable<BaseResponse<String>> generateRechargeOrder(String amount);

    /**
     * 生成推流地址。
     * @param roomId 房间号
     * @return 生成的推流地址
     */
    Observable<BaseResponse<PushStreamInfo>> generatePushStreaming(String roomId);

    /**
     * 生成拉流地址。
     * @param roomId 房间号
     */
    Observable<BaseResponse<String>> getPlaybackUrl(String roomId);

    /**
     * 给指定电话号码发送短信验证码。
     */
    Observable<BaseResponse<String>> sendCaptcha(String phone);

//    管理员列表
    Observable<BaseResponse<List<RoomAdminInfo>>> getAdmin(String token, String anchorid);
    //    管理员列表
    Observable<BaseResponse<Object>> removeAdmin(String token, String anchorid,String adminid);
    //    回播列表
    Observable<BaseResponse<List<PlayBackInfo>>> getPlayBack(String token,String roomID);
    //    回播url
    Observable<BaseResponse<String>> getPlayBackListUrl(String roomID, String start, String end);
//     话题列表
    Observable<BaseResponse<ThemBean>> getThemBean();
//  创建房间传递话题
    Observable<BaseResponse<Object>> postCreatRoom(String token, String title,String roomid,String city,String province);
    //黑名单
    Observable<BaseResponse<List<HitList>>> getHitList(String token);
    //     话题列表
    Observable<BaseResponse<ThemBean>> getThemBean(String title,String number);
    //    拉黑
    Observable<BaseResponse<Object>> setHit(String token,String hitid);
    //    解除拉黑
    Observable<BaseResponse<Object>> removeHit(String token,String hitid);
//    小伙伴
    Observable<BaseResponse<List<GetFriendBean>>> getFriendList();

    /***
     * wsh  魅力榜
     * 2016/9/21
     */
    Observable<BaseResponse<List<MeiLiBangBean>>> meilibang(int pageNum);
    /***
     * wsh  魅力榜
     * 2016/9/22
     */
    Observable<BaseResponse<List<MeiLiBangBean>>> fuHaobang(int pageNum);
    /***
     * wsh  发布动态
     * 2016/9/22
     */
    Observable<BaseResponse<PublishBean>> publish(String token, String content, String pics);
    /***
     * wsh  编辑动态
     * 2016/9/22
     */
    Observable<BaseResponse<String>> updatePublish(String token,String pid,String content,String pics);
    /***
     * wsh  删除动态
     * 2016/9/22
     */
    Observable<BaseResponse<String>> deletePublish(String token, String pid);
    /***
     * wsh  回复动态
     * 2016/9/22
     */
    Observable<BaseResponse<PublishBean>> replyOne(String token, String pid,String content);
    /***
     * wsh  dianan
     * 2016/9/22
     */
    Observable<BaseResponse<String>> dianzan(String token, String pid,String isLike);
    /***
     * wsh  dianan
     * 2016/9/22
     */
    Observable<BaseResponse<PublishBean>> replyTwo(String token, String pid,String content);
    /***
     * wsh  动态列表（关注的人包括自己）
     * 2016/9/22
     */
    Observable<BaseResponse<DongTaiListBean>> dongTaiLieBiao(String token, String page, String pagesize);
    /***
     * wsh  动态详情
     * 2016/9/22
     */
    Observable <BaseResponse<DongTaiDetailBean>> getDongTaiDetail(String token, String pid, String max_like, String max_reply);
    /***
     * wsh  删除回复
     * 2016/9/25
     */
    Observable <BaseResponse<String>> replyDelete(String token, String rid);

    /***
     * 我的动态列表
     * @param token
     * @param page
     * @param pagesize
     * @return
     */
    Observable <BaseResponse<List<MyDongTaiBean>>> getMyDongTaiLieBiao(String token, String page, String pagesize);

    /***
     * 回复列表
     * @param token
     * @param pid
     * @param max_reply
     * @return
     */
    Observable<BaseResponse<DongTaiListBean.DongTaiItem.ReplyList>> getHuiFuList(String token, String pid, String  pageNo,String pageSize);
    /***
     * 点赞列表
     * @param token
     * @param pid
     * @param max_reply
     * @return
     */
    Observable<BaseResponse<DongTaiListBean.DongTaiItem.ReplyList>> getDianZanList(String token, String pid, String  pageNo,String pageSize);
}
